%输入参数：果蝇群体坐标(X_axis && Y_axis)，果蝇种群大小，果蝇种群坐标维度，果蝇种群单词移动最大步长
%输出参数：果蝇种群嗅觉搜索之后新坐标(X && Y)，果蝇群体的味道浓度判定值Si
%注意我这里忘记限制了果蝇坐标的范围，详见FOA_version4改进果蝇算法工程问题
%% version：1.0 last update:2022/4/13 author:hanjie-chen

function [Smell_i,X,Y]=Smell_Search_Function(X_axis,Y_axis,population_size,dim,L)
%     初始化参数，使其成为两个population_size*dim的全0数组
    origin_distance=zeros(population_size,dim);
    Smell_i=zeros(population_size,dim);
%     扩充种群坐标
    X_axis=repmat(X_axis,population_size,1);    
    Y_axis=repmat(Y_axis,population_size,1);
%     嗅觉搜索：让果蝇随机飞行之后 求出每个果蝇的坐标矩阵;
    X=X_axis+L*(2*(rand(population_size,dim)-1/2));  
    Y=Y_axis+L*(2*(rand(population_size,dim)-1/2));
%     求出所有果蝇个体距离原点的距离sqrt(Xi^2+Yi^2)
    origin_distance=(X.^2+Y.^2).^0.5; 
%     求出所有果蝇的味道浓度判定值Si=1/origin_distance
    Smell_i=1./origin_distance;  
end
%%
% 视觉搜索同时找到最佳适应度果蝇个体
[BestSmell,Index]=Fitness_Function(Smell_i);
% 取得最优个体的两个维度的X,Y坐标，其余果蝇的坐标像这个位置集中
    X_axis=X(Index,:);
    Y_axis=Y(Index,:);
%% 迭代循环
    for iteration_turn=1:max_iteration
    %% 嗅觉搜索
        [Smell_i,X,Y]=Smell_Search_Function(X_axis,Y_axis,population_size,dimension,max_fly_distance);
    %% 视觉搜索
        [BestSmell,Index]=Fitness_Function(Smell_i);
%   如果本次搜索发现适应度更好，那么更新位置
        if BestSmell<SmellBest
            X_axis=X(Index,:);
            Y_axis=Y(Index,:);    
%       更新极值
            SmellBest=BestSmell;
        end
%   记录每次迭代的最优值和坐标
        Smell_best(iteration_turn)=SmellBest;
    end
